Skip to content

feat: Edition-Verifikation — stille Auflagen-Verwechslung verhindern#81

Open
TillQuandel wants to merge 1 commit into
fix/pagelabel-anchorsfrom
fix/edition-verify
Open

feat: Edition-Verifikation — stille Auflagen-Verwechslung verhindern#81
TillQuandel wants to merge 1 commit into
fix/pagelabel-anchorsfrom
fix/edition-verify

Conversation

@TillQuandel

Copy link
Copy Markdown
Owner

Problem (Wurzel)

Ein Kapitel-Extrakt trägt keine Impressum-Seite (ISBN/„N. Auflage"/Copyright stehen nur in der Titelei des Gesamtbands). Die Pipeline leitet Jahr/Edition deshalb allein aus dem Dateinamen ab (<Autor> - <Jahr> - <Titel>.pdf, Filename-Jahr ist bewusst autoritativ) — ohne Abgleich gegen das Dokument. Folge: Sie zitiert still die falsche Auflage.

Konkret aufgefallen: Reimers Kapitel „Wissensorganisation" existiert in KSS-6 (2013, Druckseite 172, DOI …258264.172) und KSS-7 (2022, Druckseite 145, DOI …769043-013) — gleicher Autor, andere Seiten/DOI. Nichts in der Pipeline fängt eine Verwechslung; das einzige Signal war das schwache „kein DOI — nicht prüfbar".

Fix (2 Layer, komponieren)

Layer 1 — ehrliches Scheitern (Pipeline):

  • is_edition_unverified(doi_verified, first_print_page) → True bei Auszug (erste numerische Druckseite > 1 aus /PageLabels) ohne DOI-Beleg.
  • source_status: "edition-unverified" + starkes Flag + First-Person-NL-Framing; auto_write_decision blockt auto-vault (auch bei Score 5).
  • doi_verified nur bei echter CrossRef-Auflösung (nicht bloßem --doi, nicht Title-Match-Raten) → fail-closed.

Layer 3 — DOI über Seitenbereich auflösen (Extraktions-Schritt):

  • resolve_chapter_doi / pick_chapter_doi: disambiguiert CrossRef-Treffer per Startseite (beweist die Auflage), fail-closed (genau 1 DOI-Treffer, sonst None). CLI: python -m generative.tools.resolve_chapter_doi --title … --author … --start-page … --year ….

Komposition: --doi pinnen (Layer 3) → doi_verified=True → Layer-1-Flag entfällt automatisch.

Verifikation

  • Live (CrossRef): 172+2013 → KSS-6-DOI; 145+2022 → KSS-7-DOI; Unsinn/Mehrdeutig → ehrlich None.
  • Real-PDF: Extrakt (S.172, keine DOI) → geflaggt; mit DOI → frei; Vollbuch (gemischte Labels) → kein Fehlalarm.
  • Cross-Model-Review (Codex, 2 Runden): 3 Funde (fail-open bei --doi, pick_chapter_doi nicht fail-closed, KeyError ohne DOI) — alle gefixt, Re-Review bestätigt fail-closed.
  • TDD (15 neue Tests), volle generative-Suite 636 grün.

Hinweis

Gestackt auf fix/pagelabel-anchors (#79) — nutzt dessen _pdf_page_labels. Basis nach #79-Merge auf master umstellen.

🤖 Generated with Claude Code

Wurzel-Fix: Ein Kapitel-Extrakt trägt keine Impressum-Seite, die Pipeline
leitet Jahr/Edition allein aus dem Dateinamen ab — ohne Abgleich gegen das
Dokument. So zitiert sie still die falsche Auflage (z.B. Reimers
„Wissensorganisation": KSS-6 2013 S.172 vs. KSS-7 2022 S.145, gleicher Autor,
andere Seiten/DOI). Aufgefallen, weil das Kapitel in beiden Auflagen existiert.

Layer 1 — ehrliches Scheitern (Pipeline):
- is_edition_unverified(doi_verified, first_print_page): True bei Auszug
  (erste numerische Druckseite > 1 aus /PageLabels) OHNE DOI-Beleg.
- source_status: "edition-unverified" + starkes Flag + NL-Framing;
  auto_write_decision blockt auto-vault (auch bei Score 5).
- doi_verified nur bei echter CrossRef-Auflösung (nicht bloßem --doi, nicht
  Title-Match-Raten) → fail-closed.

Layer 3 — DOI über Seitenbereich auflösen (Extraktions-Schritt):
- resolve_chapter_doi/pick_chapter_doi: disambiguiert CrossRef-Treffer per
  Startseite (beweist die Auflage), fail-closed (genau 1 DOI-Treffer, sonst
  None). CLI: python -m generative.tools.resolve_chapter_doi.
- Live verifiziert: 172→KSS-6-DOI, 145→KSS-7-DOI, Unsinn→None.

Komposition: --doi pinnen (Layer 3) → doi_verified=True → Layer-1-Flag entfällt.

Cross-Model-Review (Codex, 2 Runden): 3 Funde (fail-open bei --doi,
pick_chapter_doi nicht fail-closed, KeyError ohne DOI) — alle gefixt + Re-Review
bestätigt fail-closed. TDD, volle generative-Suite (636) grün.

Gestackt auf fix/pagelabel-anchors (PR #79) — nutzt dessen _pdf_page_labels.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants